import XEUtils from 'xe-utils';
import { NumberUtils } from '@/utils';

import { TableDataType } from '@/base/pojo/TableDataType.js'


/**
 * 获取合计行数据
 *
 * @param {Object} param1 { columns, data }
 * @param {Object} param2 {
 *   row: 合计行数据
 *   title: '合计标题',
 *   fields: 合计列的字段,
 *   formats: 合计列的格式化信息,
 *  }
 * @returns totalRow 合计行数据
 */
export const getTotaledRow = ({ columns, data }, {
  title = '合计', fields, formats, totalRow=[], totalData={}, totalFormat={} 
}) => {
  columns.forEach(col => {
    if (fields.includes(col.field)) {
      let value = XEUtils.sum(data, col.field)
      totalData[col.field] = NumberUtils.formatValue(value)
      value = formatValue(value, formats[col.field])
      totalFormat[col.field] = value
      totalRow.push(value)
    } else {
      totalRow.push('')
    }
    if (col.children && col.children.length) {
      getTotaledRow({ columns: col.children, data }, { fields, formats, totalRow, totalData, totalFormat })
    }
  })
  totalRow.splice(0, 1, title);
  return {
    totalRow,
    totalData,
    totalFormat
  }
}
/**
 * 获取平均数行数据
 *
 * @param {Object} param1 { columns, data }
 * @param {Object} param2 {
 *   row: 行数据
 *   title: '标题',
 *   fields: 列的字段,
 *   formats: 列的格式化信息,
 *  }
 * @returns row 行数据
 */
export const getAverageRow = ({ columns, data }, { title = '平均', fields, formats, row = [] }) => {
  columns.forEach(col => {
    if (fields.includes(col.field)) {
      const value = formatValue(XEUtils.mean(data, col.field), formats[col.field])
      row.push(value)
    } else {
      row.push('')
    }
    if (col.children && col.children.length) {
      getAverageRow({ columns: col.children, data }, fields, formats, row)
    }
  })
  row.splice(0, 1, title);
  return row
}

// ------ formatter
/**
 * 格式化指定数据
 * 
 * @param {Any} value 数据
 * @param {String} rule 规则
 * @returns 
 */
export const formatValue = (value, rule) => {
  if (!rule) return value

  let resValue = value
  // 日期规则
  if (TableDataType.DATE.includeFormat(rule)) {
    resValue = XEUtils.toDateString(resValue, rule)
  }
  // 数字规则
  if (TableDataType.NUMBER.includeFormat(rule)) {
    let digits = 0
    const digitItem = rule.split('.')[1]
    if (digitItem) digits = (digitItem.match(/0/g) || []).length
    resValue = XEUtils.commafy(resValue, { digits })
  }
  // 账号规则
  if (TableDataType.ACCOUNT.includeFormat(rule)) {
    let formatItem = TableDataType.ACCOUNT.getFormatItem(rule)
    resValue = formatItem.formatValue(resValue)
  }
  return resValue || ''
}

export default {
  /**
   * 转换为短横线命名
   *
   * @param {String} name 需要转换的名称
   */
  toKebabCase: (name) => {
    const result = name.replace(/([A-Z])/g, (match, p1, offset, string) => {
      // 一个捕获组捕获全部，所以match等于p1
      return '-' + p1.toLowerCase();
    });
    return result
  },
  /**
   * 转换为驼峰式命名
   *
   * @param {String} name 需要转换的名称
   */
  toCamelCase: (name) => {
    const result = name.replace(/(\-([a-z]))/g, (match, p1, p2, offset, string) => {
      // 这里有两个捕获组，第一个捕获组捕获全部并包含了第二个捕获组，所以match等于p1
      return p2.toUpperCase();
    });
    return result
  }
}
